home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Cream of the Crop 26
/
Cream of the Crop 26.iso
/
program
/
wsc4c21.zip
/
MODEM.C
< prev
next >
Wrap
C/C++ Source or Header
|
1997-05-22
|
12KB
|
436 lines
/*
** MODEM.C
**
** Modem exerciser example program.
*/
#define USECOMM
#include <windows.h>
#ifdef WIN32
#define USE_INS HINSTANCE
#define USE_PTR PSTR
#else
#define USE_INS HANDLE
#define USE_PTR LPSTR
#endif
#include "modem.h"
#include "message.h"
#include "wsc.h"
#include "ascii.h"
#include "config.h"
#include "paint.h"
#include "line.h"
#include "menu.h"
#include "about.h"
#include "sioerror.h"
#define MENU_BAR_CHANGE 1
/* public globals */
HWND hMainWnd; /* main window handle */
HWND hInfoWnd; /* popup handle */
USE_INS hInstance; /* program instance */
int OnLineFlag = FALSE; /* TRUE: online */
int FatalFlag = FALSE; /* TRUE: fatal error */
char *Alpha = "TestABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n";
char Temp[1024];
/* private globals */
static int WinWidth = 8 * NCOLS;
static int WinHeight = 12 * NROWS + 48;
/* miscellaneous functions */
void ErrorCheck(int);
void ErrorMessage(char *);
#ifdef WIN32
int WINAPI
#else
int PASCAL
#endif
WinMain(USE_INS hInst,USE_INS hPrevInstance,USE_PTR lpCmdLine,int nCmdShow)
{WNDCLASS wc;
MSG msg;
BOOL Result;
if(!hPrevInstance)
{/* register main window class */
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = MainWndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInst;
wc.hIcon = LoadIcon(hInst, "ModemIcon");
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = "ModemMenu";
wc.lpszClassName = "ModemWClass";
Result = RegisterClass(&wc);
if(!Result) return FALSE;
}
/* create main window */
hInstance = hInst;
hMainWnd = CreateWindow(
"ModemWClass", "Modem", WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
WinWidth, WinHeight,
NULL, NULL,
hInstance, NULL);
ShowWindow(hMainWnd, nCmdShow);
UpdateWindow(hMainWnd);
/* window control loop */
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (msg.wParam);
} /* end WinMain */
#ifdef WIN32
LRESULT CALLBACK
#else
long FAR PASCAL
#endif
MainWndProc(HWND hWindow,UINT iMsg,WPARAM wParam,LPARAM lParam)
{int i, n;
int Count;
int StatusWord;
HDC hDC;
UINT idTimer;
PAINTSTRUCT ps;
#ifdef WIN32
#else
static FARPROC lpfnAboutDlgProc;
#endif
static int ThePort;
hMainWnd = hWindow;
switch (iMsg)
{case WM_COMMAND:
switch(wParam)
{case MSG_ABOUT:
#ifdef WIN32
DialogBox(hInstance,"AboutBox",hMainWnd,AboutDlgProc);
#else
DialogBox(hInstance,"AboutBox",hMainWnd,lpfnAboutDlgProc);
#endif
break;
case MSG_DEBUG:
break;
case MSG_TEST:
DisplayLine("Sending test string 'TestABCD...XYZ' 32 times");
for(i=0;i<32;i++) SioPuts(ThePort,Alpha,32);
break;
case MSG_ONLINE:
if(FatalFlag) ErrorMessage("Fatal Error");
else
{/* try to go on-line */
ThePort = GetPort();
GoOnLine(ThePort,GetBaud(),1024,512);
SetTitle();
/* update menu settings */
CheckTheMenu(MSG_DTR_SET);
CheckTheMenu(MSG_RTS_SET);
UncheckTheMenu(MSG_HW_FLOW);
UncheckTheMenu(MSG_SW_FLOW);
CheckTheMenu(MSG_NO_FLOW);
CheckTheMenu(MSG_ONLINE);
UncheckTheMenu(MSG_OFFLINE);
EnableTheMenu(MSG_OFFLINE);
DisableTheMenu(MSG_ONLINE);
DisableMenuBarItem(MENU_BAR_CHANGE);
for(i=2;i<=5;i++) EnableMenuBarItem(i);
DrawMenuBar(hMainWnd);
if(!OnLineFlag) break;
}
break;
case MSG_OFFLINE:
GoOffLine(ThePort);
SetTitle();
/* update menu settings */
CheckTheMenu(MSG_OFFLINE);
UncheckTheMenu(MSG_ONLINE);
EnableTheMenu(MSG_ONLINE);
DisableTheMenu(MSG_OFFLINE);
EnableMenuBarItem(MENU_BAR_CHANGE);
for(i=2;i<=5;i++) DisableMenuBarItem(i);
DrawMenuBar(hMainWnd);
break;
case MSG_EXIT:
GoOffLine(ThePort);
KillTimer(hMainWnd,idTimer);
PostQuitMessage(0);
break;
case MSG_110:
SetBaud(Baud110);
break;
case MSG_300:
SetBaud(Baud300);
break;
case MSG_1200:
SetBaud(Baud1200);
break;
case MSG_2400:
SetBaud(Baud2400);
break;
case MSG_4800:
SetBaud(Baud4800);
break;
case MSG_9600:
SetBaud(Baud9600);
break;
case MSG_19200:
SetBaud(Baud19200);
break;
case MSG_38400:
SetBaud(Baud38400);
break;
case MSG_57600:
SetBaud(Baud57600);
break;
case MSG_COM1:
SetThePort(COM1);
break;
case MSG_COM2:
SetThePort(COM2);
break;
case MSG_COM3:
SetThePort(COM3);
break;
case MSG_COM4:
SetThePort(COM4);
break;
case MSG_NONE:
SetParity(NoParity);
break;
case MSG_EVEN:
SetParity(EvenParity);
break;
case MSG_ODD:
SetParity(OddParity);
break;
case MSG_1_SB:
SetStopBits(OneStopBit);
break;
case MSG_2_SB:
SetStopBits(TwoStopBits);
break;
case MSG_7_DB:
SetWordLength(WordLength7);
break;
case MSG_8_DB:
SetWordLength(WordLength8);
break;
case MSG_DTR_SET:
SioDTR(ThePort,'S');
CheckTheMenu(MSG_DTR_SET);
UncheckTheMenu(MSG_DTR_CLR);
break;
case MSG_DTR_CLR:
SioDTR(ThePort,'C');
CheckTheMenu(MSG_DTR_CLR);
UncheckTheMenu(MSG_DTR_SET);
break;
case MSG_RTS_SET:
SioRTS(ThePort,'S');
CheckTheMenu(MSG_RTS_SET);
UncheckTheMenu(MSG_RTS_CLR);
break;
case MSG_RTS_CLR:
SioRTS(ThePort,'C');
CheckTheMenu(MSG_RTS_CLR);
UncheckTheMenu(MSG_RTS_SET);
break;
case MSG_HW_FLOW:
SioFlow(ThePort,'H');
CheckTheMenu(MSG_HW_FLOW);
UncheckTheMenu(MSG_SW_FLOW);
UncheckTheMenu(MSG_NO_FLOW);
break;
case MSG_SW_FLOW:
SioFlow(ThePort,'S');
CheckTheMenu(MSG_SW_FLOW);
UncheckTheMenu(MSG_HW_FLOW);
UncheckTheMenu(MSG_NO_FLOW);
break;
case MSG_NO_FLOW:
SioFlow(ThePort,'N');
CheckTheMenu(MSG_NO_FLOW);
UncheckTheMenu(MSG_HW_FLOW);
UncheckTheMenu(MSG_SW_FLOW);
break;
case MSG_STATUS:
StatusWord = SioStatus(ThePort, 0x0FFFF);
#if 0
wsprintf((LPSTR)Temp,"Status = %xH", StatusWord);
DisplayLine(Temp);
#endif
/* RX overflow ? */
if((WSC_RXOVER & StatusWord) != 0)
DisplayLine("[Receive queue overflow]");
/* TX overflow */
if((WSC_TXFULL & StatusWord) != 0)
DisplayLine("[Transmit queue overflow]");
/* Show RX queue size */
n = SioRxQue(ThePort);
if(n>0)
{wsprintf((LPSTR)Temp,"[%d bytes in RX queue]",n);
DisplayLine(Temp);
}
/* Show TX queue size */
n = SioTxQue(ThePort);
if(n>0)
{wsprintf((LPSTR)Temp,"[%d bytes in TX queue size]",n);
DisplayLine(Temp);
}
/* BREAK signal status */
if(SioBrkSig(ThePort, 'D') > 0) DisplayLine("[BREAK detected]");
/* DSR status */
if(SioDSR(ThePort) > 0) DisplayLine("[DSR set]");
else DisplayLine("[DSR clear]");
/* CTS status */
if(SioCTS(ThePort) > 0) DisplayLine("[CTS set]");
else DisplayLine("[CTS clear]");
/* DCD (Data Carrier Detect) status */
if(SioDCD(ThePort) > 0) DisplayLine("[DCD set]");
else DisplayLine("[DCD clear]");
break;
default:
return (DefWindowProc(hMainWnd, iMsg, wParam, lParam));
}
break;
case WM_CREATE:
/* check "OFFLINE" menu item */
CheckTheMenu(MSG_OFFLINE);
DisableTheMenu(MSG_OFFLINE);
/* disable all but LINE & CHANGE */
for(i=2;i<=5;i++) DisableMenuBarItem(i);
#ifdef WIN32
#else
/* create AboutDlgProc() thunk */
lpfnAboutDlgProc = MakeProcInstance(AboutDlgProc, hInstance);
#endif
/* initialize paint module */
PaintInit();
/* init configuration */
CheckAll();
CheckTheMenu(MSG_NO_FLOW);
UncheckTheMenu(MSG_HW_FLOW);
UncheckTheMenu(MSG_SW_FLOW);
SetText((LPSTR)"MODEM");
SetTitle();
/* start timer */
idTimer = SetTimer(hMainWnd,1,125,NULL);
if(idTimer==0)
{ErrorMessage("No timers remaining !");
FatalFlag = TRUE;
}
break;
case WM_CHAR:
SioPutc(ThePort, (char)wParam );
break;
case WM_TIMER:
/* fatal error ? */
if(FatalFlag) break;
if(!OnLineFlag) break;
/* fetch up to 1024 chars */
Count = SioGets(ThePort,Temp,1024);
if(Count>0) WriteTheString(Temp,Count);
break;
case WM_SETFOCUS:
/* create client area caret */
CreateCaret(hMainWnd,NULL,3,10);
SetCaretPos(PaintGetColPos(),PaintGetRowPos());
ShowCaret(hMainWnd);
break;
case WM_KILLFOCUS:
DestroyCaret();
break;
case WM_PAINT:
HideCaret(hMainWnd);
hDC = BeginPaint(hMainWnd, &ps);
SetMapMode(hDC,MM_ANISOTROPIC);
SelectObject(hDC, GetStockObject(OEM_FIXED_FONT) );
PaintMain(hDC,&ps);
EndPaint(hMainWnd,&ps);
SetCaretPos(PaintGetColPos(),PaintGetRowPos());
ShowCaret(hMainWnd);
break;
case WM_DESTROY:
GoOffLine(ThePort);
if(idTimer) KillTimer(hMainWnd,idTimer);
PostQuitMessage(0);
break;
default:
return (DefWindowProc(hMainWnd, iMsg, wParam, lParam));
}
return 0;
} /* end MainWndProc */
void ErrorCheck(int Code)
{/* trap PCL error codes */
if(Code<0)
{SioError(Code,"Sio Error");
SioDone(GetPort());
FatalFlag = TRUE;
}
}
void ErrorMessage(char *MsgPtr)
{
MessageBox(hMainWnd,MsgPtr,"ERROR",MB_ICONEXCLAMATION | MB_OK);
}